package org.dllwh.dm;

import org.junit.Test;

import java.sql.*;

/**
 * 把今天最好的表现当作明天最新的起点．．～
 * <p>
 * Today the best performance as tomorrow the newest starter!
 *
 * @ClassName DmJdbcDriverTest
 * @Description DM 集成 JDBC 接口
 * @Date 2024-10-29 15:02
 * @版本 V 1.0.1
 * @see <a href="https://eco.dameng.com/document/dm/zh-cn/app-dev/java-jdbc.html">JDBC 接口</a>
 * @since JDK 17
 */
public class DmJdbcDriverTest {
    /**
     * 创建表
     */
    @Test
    public void createTable() throws SQLException {
        Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();
        // 创建表语句
        String createSql = "CREATE TABLE city ( id CHAR(3) NOT NULL, name VARCHAR(40) NULL, region INT NULL );";
        // 创建语句对象
        PreparedStatement preparedStatement = conn.prepareStatement(createSql);
        // 执行语句
        preparedStatement.executeUpdate();
        // 关闭语句
        DmJdbcHelperUtil.release(null, preparedStatement, conn);
    }

    /**
     * 往表插入数据
     */
    @Test
    public void insertTable() throws SQLException {
        Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();
        // 创建表语句
        String insertSql = "INSERT INTO city(id, name, region) VALUES('BJ', '北京', 1)";
        // 创建语句对象
        PreparedStatement preparedStatement = conn.prepareStatement(insertSql);
        // 执行语句
        preparedStatement.executeUpdate();
        // 关闭语句
        DmJdbcHelperUtil.release(null, preparedStatement, conn);
        System.out.println("插入成功");
    }

    /**
     * 查询表数据
     */
    @Test
    public void queryTable() throws SQLException {
        Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();
        // 查询语句
        String querySql = "SELECT * FROM city";
        // 创建语句对象
        PreparedStatement preparedStatement = conn.prepareStatement(querySql);
        // 执行查询
        ResultSet resultSet = preparedStatement.executeQuery();
        // 显示结果集
        displayResultSet(resultSet);
        // 关闭
        DmJdbcHelperUtil.release(resultSet, preparedStatement, conn);
    }

    /**
     * 处理查询结果集。
     * <p>
     * 获取当前光标指向行中的数据，有三种方式：
     * <p>
     * 第一种方式：根据字段下标获取，不管数据库表中的字段是什么类型，都以字符串方式取出。
     * 第二种方式：通过结果集中字段名称获取数据，该方式的程序更加健壮，建议使用。
     * 第三种方式：通过特定类型获取数据，该方式，明确知道字段的类型，可以节省类型转换花费的性能，该方式的程序更加健壮，性能更高，推荐使用
     *
     * @param resultSet 结果集对象
     */
    private void displayResultSet(ResultSet resultSet) throws SQLException {
        // 将光标向前移动一行，如果指向当前行有记录，则返回true，若指向当前行无记录，返回false
        while (resultSet.next()) {
            /*
             * 第一种方式
             */
            String id1 = resultSet.getString(1);
            String name1 = resultSet.getString(2);
            System.out.println("id1:" + id1 + "，名称1：" + name1);

            /*
             * 第二种方式
             */
            String id2 = resultSet.getString("id");
            String name2 = resultSet.getString("name");
            System.out.println("id2:" + id2 + "，名称2：" + name2);

            /*
             * 第三种方式
             */
            String id3 = resultSet.getString("id");
            String name3 = resultSet.getString("name");
            System.out.println("id3:" + id3 + "，名称3：" + name3);
        }
    }

    /**
     * 修改表数据
     */
    @Test
    public void updateTable() throws SQLException {
        Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();
        // 更新数据语句
        String updateSql = "update city set name = '北京_BJ' where id = 'BJ'";
        // 创建语句对象
        PreparedStatement preparedStatement = conn.prepareStatement(updateSql);
        // 执行语句
        preparedStatement.executeUpdate();
        // 关闭语句
        DmJdbcHelperUtil.release(null, preparedStatement, conn);
        System.out.println("更新成功");
    }

    /**
     * 绑定变量示例
     */
    @Test
    public void preparedStatementTest() throws SQLException {
        Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();
        // 更新数据语句
        String updateSql = "update city set name = ? where id = ?";
        // 创建语句对象
        PreparedStatement preparedStatement = conn.prepareStatement(updateSql);
        // 通过连接对象和修改语句的模板，创建 java.sql.PreparedStatement 对象
        preparedStatement.setString(1, "北京_BJ");
        preparedStatement.setString(2, "BJ");
        // 执行语句
        preparedStatement.executeUpdate();
        // 关闭语句
        DmJdbcHelperUtil.release(null, preparedStatement, conn);
        System.out.println("更新成功");
    }

    /**
     * 删除表数据
     */
    @Test
    public void deleteTable() throws SQLException {
        Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();
        // 删除数据语句
        String deleteSql = "delete from city where id = 'BJ'";
        // 创建语句对象
        PreparedStatement preparedStatement = conn.prepareStatement(deleteSql);
        // 执行语句
        preparedStatement.executeUpdate();
        DmJdbcHelperUtil.release(null, preparedStatement, conn);
        System.out.println("删除成功");
    }
}
